
package tableur;

import structure.*;
import java.awt.Point;
import java.io.File;
import java.util.Iterator;
import java.util.List;

import java.util.Vector;

/**
 * Testeur
 * 
 * @author Robert Aubé
 * @version V1.1 31 octobre 2008 (Robert Aubé)
 */
public class Testeur
{

	// nom du fichier
	static String NOM_FICHIER = "matrice_creuse_tests.dat";

	private static Object valDef = new String("");
	private int errCpt = 0;
	private static int forceTest = 600;

	// Matrice contenant les valeurs1 d'origine
	static Object[][] valeurs1 =
	{
	{ new Integer(0), "", "", },
	{ new Integer(1111), new Integer(1), "" },
	{ new Integer(1), new Integer(2), new Integer(3) },
	{ "", "", "" } };

	// Matrice de même dimension mais avec les valeurs1 modifées
	static Object[][] valeurs2 =
	{
	{ new Integer(10), "aa", "ss1", },
	{ new Integer(11111), new Integer(11), "1" },
	{ new Integer(11), new Integer(12), new Integer(13) },
	{ "", "1", "1" } };

	Testeur()
	{
		DataCenter DC;

		System.out.println("\ntest Vector");
		DC = new ListDataCenter("Vector");
		test(DC);

		System.out.println("\ntest LinkedList");
		DC = new ListDataCenter("LinkedList");
		test(DC);

		System.out.println("\ntest ArrayList");
		DC = new ListDataCenter("ArrayList");
		test(DC);

		System.out.println("\ntest Hashtable");
		DC = new MapDataCenter("Hashtable");
		test(DC);

		try
		{ // pour le hashtable (Map) on ne peut pas stocker des nulls
			DC.set(0, 0, null);
			System.out.println("   ### --- attention les nulls passent ");
		}
		catch (NullPointerException e)
		{
			System.out.println("   --- Les null ne passe pas ok");
		}

		System.out.println("\ntest HashMap");
		DC = (DataCenter) new MapDataCenter("HashMap");
		test(DC);

		System.out.println("\ntest TreeMap");
		DC = new MapDataCenter("TreeMap");
		test(DC);

		System.out.println("\nFin tests");
	}

	private void test(DataCenter mat)
	{
		// Ajouter toutes les valeurs1 du tableau
		initValeurs1(mat);
		testEgaliteMC(mat, valeurs1);
		outputError("setage simple ok", "Erreur de setage simple");

		testSetSupporteRecriture(mat);

		testRemoveAllData(mat);

		initValeurs1(mat);
		testSauverOuvrirPleine(mat);
	}

	private void initValeurs1(DataCenter mat)
	{
		mat.removeAllData();
		for (int i = 0; i < valeurs1.length; i++)
			for (int j = 0; j < valeurs1[0].length; j++)
				mat.set(i, j, valeurs1[i][j]);
	}

	public void testSetSupporteRecriture(DataCenter mat)
	{
		int i, j;
		Point p;
		Object o;
		Object[] valeurs3 =
		{ new Integer(999), "", "allo" };

		List l = new Vector(forceTest);

		// 1- placer quelques valeurs de la matrice 2
		for (i = 0; i < valeurs2.length; i++)
			for (j = 0; j < valeurs2[1].length; j++)
				if ((((int) (Math.random() * 2)) == 0))
				{
					l.add(new Point(i, j));
					o = valeurs3[((int) (Math.random() * valeurs3.length))];
					l.add(o);
					mat.set(i, j, o);
				}

		// 2- placer quelques valeurs ailleurs que dans la matrice 2
		for (int cpt = 0; cpt < (forceTest); cpt++)
		{
			do
			{
				i = (int) (Math.random() * 65535);
				j = (int) (Math.random() * 65535);
				p = new Point(i, j);
			}
			while ((i < valeurs1.length && j < valeurs1[0].length)
					|| l.contains(p));
			l.add(p);
			o = valeurs3[((int) (Math.random() * valeurs3.length))];
			l.add(o);
			mat.set(i, j, o);
		}

		// System.out.println("Vérification des updates");
		// finalement vérifier que tous les set ont été fait
		Iterator it = l.iterator();
		while (it.hasNext())
		{
			p = (Point) it.next();
			o = it.next();
			assertEquals(mat.get(p.x, p.y), o);
		}
		outputError("updates ok", "Erreur d'updates");
	}

	public void testEgaliteMC(DataCenter mc, Object[][] valeurs)
	{
		int i, j;

		// Vérifier que la matrice creuse est la même que celle sauvée
		for (i = 0; i < valeurs.length; i++)
			for (j = 0; j < valeurs[0].length; j++)
				assertEquals(valeurs1[i][j], mc.get(i, j));

		// Vérifier des valeurs par défaut sont accessibles aux bon endroits
		for (int cpt = 0; cpt < forceTest; cpt++)
		{
			do
			{
				i = (int) (Math.random() * 65535);
				j = (int) (Math.random() * 65535);
			}
			while (i < valeurs.length && j < valeurs[i].length);
			assertEquals(valDef, mc.get(i, j));
		}
		assertEquals(valDef, mc.get(65535, 0));
		assertEquals(valDef, mc.get(0, 65535));
		assertEquals(valDef, mc.get(65535, 65535));

	}

	public static void main(String[] args)
	{
		Testeur t = new Testeur();
	}

	public void testRemoveAllData(DataCenter mat)
	{
		// Enlever toute les données et vérifier si on obtient toujours la
		// valeur par défaut
		mat.removeAllData();
		estVierge(mat);
		outputError("matrice vide ok", "n'est pas vierge");
	}

	public void estVierge(DataCenter mat)
	{
		for (int cpt = 0; cpt < forceTest; cpt++)
			assertEquals(valDef, mat.get((int) (Math.random() * 65535),
					(int) (Math.random() * 65535)));
		assertEquals(valDef, mat.get(0, 0));
		assertEquals(valDef, mat.get(65535, 0));
		assertEquals(valDef, mat.get(0, 65535));
		assertEquals(valDef, mat.get(65535, 65535));
	}

	public void testSauverOuvrirPleine(DataCenter mat)
	{
		// Si le fichier existe déjà, l'effacer
		File f = new File(NOM_FICHIER);
		if (f.exists() && f.isFile())
			f.delete();

		// Tester l'enregistrement d'un fichier
		try
		{
			mat.Enregistrer(NOM_FICHIER);
		}
		catch (Exception ex)
		{
			System.out.println(" ### Erreur de sauvegarde");
		}
		mat.removeAllData();
		// Tester l'ouverture d'un fichier
		try
		{
			// Ouvrir le fichier et vérifier si on a les mêmes valeurs1
			mat.Ouvrir(NOM_FICHIER);

			// Vérifier si les valeurs1 sont identiques
			testEgaliteMC(mat, valeurs1);
		}
		catch (Exception ex)
		{
			System.out.println(" ### Erreur de recuperation");
		}
		outputError("sauvegarde ok", "Erreur de sauvegarde rÃ©cupÃ©ration");
	}

	private void assertEquals(Object object, Object object1)
	{
		if (object == null || object1 == null)
			return;
		if (object.equals(object1))
			return;
		errCpt++;
	}

	private boolean assertTrue(boolean Res)
	{
		if (!Res)
			errCpt++;
		return Res;
	}

	public void outputError(String ok, String err)
	{
		if (errCpt > 0)
			showError(err);
		else
			ShowSucces(ok);
		errCpt = 0;
	}

	public void outputError(String message)
	{
		outputError(message, message);
	}

	void showError(String message)
	{
		String S;
		S = "   ### " + message + " -->  [ERREUR";
		S += (errCpt > 0) ? " " + errCpt + "x" : "";
		System.out.println(S + "]");
	}

	void ShowSucces(String message)
	{
		System.out.println("   --- " + message + " -->  [Ok]");
	}
}
